home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
libg_261.zip
/
libg_261
/
libg++
/
etc
/
lf
/
directory.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1993-04-25
|
3KB
|
98 lines
#include <stdio.h>
#include <std.h>
#include "Dirent.h"
#include "option.h"
#include "entry.h"
#include "directory.h"
/* Provided in the main driver program. */
extern Option_Handler option;
/* Names used to print out various file classes. */
char *Directory_Handler::class_name[Directory_Handler::MAX_TYPES] =
{
"Directory", "Regular", "Executable", "Directory Link", "File Link", "Symbolic Link", "Unknown"
};
/* Read each file in the current directory, and enter it into
the correct file class according to its file type.
Then, for each file class, sort the class entries by
name and print them to the standard output. */
Directory_Handler::Directory_Handler (void)
{
Dirent directory (".");
file_types file_type;
/* "." always works, since a chdir is performed earlier if a
user-specified directory was supplied on the command-line. */
if (!option[HIDDEN])
{
/* Skip the first two directory entries ("." and ".."). This
is fast, but potentially non-portable. Does this fail
on anyone's system? If so, I'll change it (barf). */
directory.readdir ();
directory.readdir ();
}
/* Main loop in program. Read each directory entry, classify it
according to its type, then enter it into the appropriate table slot. */
for (struct dirent *dir_buf; dir_buf = directory.readdir (); )
{
if (!option[HIDDEN] && *dir_buf->d_name == '.')
continue;
struct stat stat_buf;
#if !defined(S_ISLNK) && defined(S_IFLNK)
#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
#endif
#ifndef S_ISLNK
#define lstat stat
#endif
lstat (dir_buf->d_name, &stat_buf);
if (S_ISREG(stat_buf.st_mode))
{
#ifdef S_IEXEC
if (stat_buf.st_mode & S_IEXEC)
file_type = EXECS;
else
#endif
file_type = FILES;
}
#ifdef S_ISLNK
else if (S_ISLNK(stat_buf.st_mode)) {
if (option[LINK]) // Either a file or directory link
{
stat (dir_buf->d_name, &stat_buf);
file_type = S_ISDIR(stat_buf.st_mode) ? DLINKS : FLINKS;
}
else
file_type = LINKS;
}
#endif
else if (S_ISDIR(stat_buf.st_mode))
file_type = DIRS;
else
file_type = UNKNOWN_FILE;
file_class[file_type].add_entry (dir_buf->d_name,
strlen (dir_buf->d_name));
}
}
/* Sort file class entries and print them to stdout. */
void
Directory_Handler::print (void)
{
for (int i = 0; i < MAX_TYPES; i++)
if (file_class[i].entry_number () > 0)
{
file_class[i].sort_entries ();
file_class[i].print_entries (class_name[i]);
}
}